package alt;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import model.Angebotstyp;
import model.Person;

/**
 * Diese Klasse stellt ein Angebot dar.
 * 
 * @author dorina-sabine.bernhardt@stud.hdu-deggendorf.de Benoegtigte Lib:
 *         WebContent/WEB-INF/lib/ejb3-persistence.jar Letzte Aenderung:
 *         29.04.12 SB Klassenimplementierung
 */
@Entity
// Die Annotation @Entity dient dazu eine Klasse als persistent zu definieren.
@Table(name = "Angebote")
// Falls die Tabelle in der Datenbank nicht denselben Namen hat wie die Klasse
// so kann der Tabellenname mit Hilfe der Annotation @Table definiert werden.
public class Angebot {
	@Id
	// Annotation @Id, gibt an, welches Attribut der Klasse als Identität
	// (Primärschlüssel) fungieren soll
	@GeneratedValue
	// Die Identität eines Objektes kann mit dieser Annotation auch automatisch
	// generiert werden.
	@Column(name = "AID")
	// Die Annotation dient dazu, das Attribut in der Datenbank zu definieren;
	// (Bsp: name="familienname", length=30, nullable=false)
	/**
	 * Die id des Angebots.
	 */
	private int id;

	/**
	 * Datum des Beginns des Angebots.
	 */
	private Date von;

	/**
	 * Datum des Endes des Angebots.
	 */
	private Date bis;

	@ManyToOne
	@JoinColumn(name = "ATID", nullable = false)
	private Angebotstyp angebotstyp;

	@ManyToOne
	@JoinColumn(name = "PID", nullable = false)
	private Person anbieter;

	/**
	 * Einfacher Konstruktor der ein neues Angebotsobjekt erstellt. Die Felder
	 * des Objekts werden hierbei mit <code>0</code>/<code>null</code> gefüllt.
	 */
	public Angebot() {
		this.setId(id);
		this.setAnbieter(anbieter);
		this.setAngebotstyp(angebotstyp);
		this.setBis(bis);
		this.setVon(von);
	}

	/**
	 * Konstruktor der ein Angebot anhand eines bereits bestehenden Angebots
	 * erzeugt. Beachte dass zwar simple Datentypen neu abgelegt werden,
	 * Referenzen jedoch einfach übernommen werden (shallow copy). Sprich:
	 * beispielsweise eine Änderung im Datumsobjekt eines so erstellten Angebots
	 * führt auch zu einer Änderung im hier übergebenen (Original) Datumsobjekt,
	 * da die Referenz auf dasselbe Datumsobjekt zeigt.
	 * 
	 * @param angebot
	 *            das Angebot anhand dessen das neue Angebot erstellt wird
	 */
	public Angebot(Angebot angebot) {
		this.setId(angebot.getId());
		this.setAnbieter(angebot.getAnbieter());
		this.setAngebotstyp(getAngebotstyp());
		this.setVon(angebot.getVon());
		this.setBis(angebot.getBis());
	}

	/**
	 * Diese Methode gibt das Datum das den Anfang des Zeitraums dieses Angebots
	 * darstellt zurück.
	 * 
	 * @return {@link Date} - der Anfang des Zeitraums dieses Angebots
	 */
	public Date getVon() {
		return von;
	}

	/**
	 * Diese Methode setzt das Datum das den Anfang des Zeitraums dieses
	 * Angebots darstellt auf den übergebenen Wert.
	 * 
	 * @param von
	 *            {@link Date} - der Anfang des Zeitraums dieses Angebots
	 */
	public void setVon(Date von) {
		this.von = von;
	}

	/**
	 * Diese Methode gibt das Datum das das Ende des Zeitraums dieses Angebots
	 * darstellt zurück.
	 * 
	 * @return {@link Date} - das Ende des Zeitraums dieses Angebots
	 */
	public Date getBis() {
		return bis;
	}

	/**
	 * Diese Methode setzt das Datum das das Ende des Zeitraums dieses Angebots
	 * darstellt auf den übergebenen Wert.
	 * 
	 * @param bis
	 *            {@link Date} - das Ende des Zeitraums dieses Angebots
	 */
	public void setBis(Date bis) {
		this.bis = bis;
	}

	/**
	 * Diese Methode gibt die {@link Person} die den Anbieter dieses Angebots
	 * darstellt zurück.
	 * 
	 * @return die {@link Person} die den Anbieter dieses Angebots darstellt
	 */
	public Person getAnbieter() {
		return anbieter;
	}

	/**
	 * Diese Methode setzt die {@link Person} die den Anbieter dieses Angebots
	 * darstellt auf den übergebenen Wert.
	 * 
	 * @param anbieter
	 *            die {@link Person} die den Anbieter des Angebots darstellt
	 */
	public void setAnbieter(Person anbieter) {
		this.anbieter = anbieter;
	}

	/**
	 * Diese Methode gibt den {@link Angebotstyp} dieses Angebots zurück.
	 * 
	 * @return den {@link Angebotstyp} dieses Angebots
	 */
	public Angebotstyp getAngebotstyp() {
		return angebotstyp;
	}

	/**
	 * Diese Methode setzt den {@link Angebotstyp} dieses Angebots auf das
	 * übergebene Objekt.
	 * 
	 * @param angebotstyp
	 *            der neu zugewiesene {@link Angebotstyp}
	 */
	public void setAngebotstyp(Angebotstyp angebotstyp) {
		this.angebotstyp = angebotstyp;
	}

	/**
	 * Diese Methode gibt den Wert der id dieses Angebots zurück.
	 * 
	 * @return int der den Wert der id dieses Angebots darstellt
	 */
	public int getId() {
		return id;
	}

	/**
	 * Diese Methode setzt die id dieses Angebots auf den übergebenen Wert.
	 * 
	 * @param id
	 *            der neu zugewiesene Wert
	 */
	public void setId(int id) {
		this.id = id;
	}

}
